package demo.TCPtest;

import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.Socket;
import java.util.HashMap;
import java.util.Map;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.alibaba.fastjson.JSON;

public class TCPClient {
	public static final String IP_ADDR = "localhost";//服务器地址 
	public static final int PORT = 12345;//服务器端口号
	public static final String directory = "E:\\test2";
	public static Map<String,String> map = new HashMap<String,String>();
	static Logger logger = LoggerFactory.getLogger(TCPClient.class);

	public static void main(String[] args) {
		System.out.println("客户端启动...");
		FilesDirHelper.buildMap(directory,"",map);
		System.out.println("当接收到服务器端字符为 \"OK\" 的时候, 客户端将终止\n"); 
//		while (true) {
//			transferFile();
//		}
		transferFile();
	}
	public static void transferFile()
	{
		Socket socket = null;
		try {
			//创建一个流套接字并将其连接到指定主机上的指定端口号
			socket = new Socket(IP_ADDR, PORT);
			System.out.println(socket);
			//读取服务器端数据
			DataInputStream input = new DataInputStream(socket.getInputStream());
			//向服务器端发送数据
			DataOutputStream out = new DataOutputStream(socket.getOutputStream());
			System.out.println("发送当前目录结果与md5码~~~~");
			String str = JSON.toJSONString(map);
			out.writeUTF(str);
			
			int num=0;
			//等待服务器响应，如果响应为 ok 和end 那么就结束
			while (true) {
				String key = input.readUTF();//服务器返回的文件名称
				String value = input.readUTF();//服务器返回的文件md5码
				if("ok".equals(key)&&"end".equals(value))
				{
					//传输文件结束
					System.out.println("传输文件结束！一共接收："+num+"个文件！");
					break;
				}
				logger.debug("开始接收："+key);
				num++;
				//创建文件（包括文件路径） 如文件存在那么删除后重新下载。如存在说明md5码不一致需要更新。
				File f = new File(directory+key);
				try{
					//创建文件，文件存在就重建
					if(!f.exists())
					{
						f.getParentFile().mkdirs();
						f.createNewFile();
					}else
					{
						f.delete();
						f.createNewFile();
					}
				}catch (Exception e) {
					// TODO: handle exception
				}
				//返回准备完成
				out.writeUTF("ready");
				//接收文件内容
				OutputStream ops = new FileOutputStream(f);
				while(true)
				{
					int length = input.readInt();
					logger.debug("长度："+length);
					if(length<=0)
					{
						break;
					}
					byte[] buffer = new byte[length];
					input.read(buffer);
					logger.debug(FilesDirHelper.print(buffer));
					out.write(buffer);
					ops.write(buffer);
				}
				ops.close();
				logger.debug("长度："+f.length());
				System.out.println("ok:"+key);
				out.writeUTF("ok:"+key);
			}

			out.close();
			input.close();
		} catch (Exception e) {
			System.out.println("客户端异常:" + e.getMessage()); 
			e.printStackTrace();
		} finally {
			if (socket != null) {
				try {
					socket.close();
				} catch (IOException e) {
					socket = null; 
					System.out.println("客户端 finally 异常:" + e.getMessage()); 
				}
			}
		}
	}
}